%     AERO LOAD - программа для нагружения агрегатов самолета распределенной нагрузкой
%     Copyright (C) 2018-2024  Михаил Козлов
%     Сайт проекта: <http://www.fastenerdoctor.ru/>
%     Адрес электронной почты для связи с разработчиком:
%     <doctor.fastener@gmail.com>
% 
%     Эта программа является свободным программным обеспечением: Вы можете
%     распространять ее и/или изменять, соблюдая условия Универсальной общественной
%     лицензии GNU, опубликованной Фондом свободного программного обеспечения,
%     либо редакции 3, либо (на Ваше усмотрение) любой редакции, выпущенной позже.
% 
%     Эта программа распространяется в надежде на то, что она окажется полезной,
%     но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ, включая даже подразумеваемую гарантию ТОВАРНОЙ ПРИГОДНОСТИ,
%     либо ПРИГОДНОСТИ ДЛЯ ОПРЕДЕЛЕННЫХ ЦЕЛЕЙ. Ознакомьтесь с Универсальной общественной
%     лицензией GNU для получения более подробной информации.
% 
%     Вы должны были получить копию Универсальной общественной лицензии GNU
%     вместе с этой программой. Если Вы ее не получили, то перейдите по адресу:
%     <http://www.gnu.org/licenses/>.
% 
%     This program is free software: you can redistribute it and/or modify
%     it under the terms of the GNU General Public License as published by
%     the Free Software Foundation, either version 3 of the License, or
%     (at your option) any later version.
% 
%     This program is distributed in the hope that it will be useful,
%     but WITHOUT ANY WARRANTY; without even the implied warranty of
%     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
%     GNU General Public License for more details.
% 
%     You should have received a copy of the GNU General Public License
%     along with this program.  If not, see <https://www.gnu.org/licenses/>.

function Check_Psets(PSETS, MATERIALS, COORD)

% PSETS (карточка  PSOLID) | .card | .ID | .Patran_name | .Mat_ID | .CORDM | .IN | .STRESS | .ISOP | .FCTN | .COROT |
% PSETS (карточка   PCOMP) | .card | .ID | .Patran_name | .Patran_laminate_name | .Z0 | .NSM | .SB | .FT | .TREF | .GE | .LAM | .N_plies | .Laminate(N_plies,4) |
%           .Laminate(i,4) | MIDi | Ti | THETAi | SOUTi (1 = YES, 0 = NO) |
% PSETS (карточка  PCOMPG) | .card | .ID | .Patran_name | .Patran_laminate_name | .Z0 | .NSM | .SB | .FT | .TREF | .GE | .LAM | .N_plies | .Laminate(N_plies,5) | .GEFLG |
%           .Laminate(i,5) | GPLYIDi | MIDi | Ti | THETAi | SOUTi (1 = YES, 0 = NO) |
% PSETS (карточка  PSHELL) | .card | .ID | .Patran_name | .MID1 | .T | .MID2 | .I_ratio | .MID3 | .TS_T | .NSM | .Z1 | .Z2 | .MID4 |
% PSETS (карточка   PBUSH) | .card | .ID | .Patran_name | .K(6,1) | .B(6,1) | .GE(6,1) | .RCV(.SA .ST .EA .ET) | .M |
% PSETS (карточка    PROD) | .card | .ID | .Patran_name | .MID | .A | .J | .C | .NSM |
% PSETS (карточка PBMSECT) | .card | .ID | .Patran_name | .MID | .FORM | .Section_data |
% PSETS (карточка PBRSECT) | .card | .ID | .Patran_name | .MID | .FORM | .NSM | .Section_data |
% PSETS (карточка    PBAR) | .card | .ID | .Patran_name | .MID | .A | .I1 | .I2 | .J | .NSM | .C1 | .C2 | .D1 | .D2 | .E1 | .E2 | .F1 | .F2 | .K1 | .K2 | .I12 |
% PSETS (карточка   PBARL) | .card | .ID | .Patran_name | .MID | .GROUP | .TYPE | .DIM(:,1)| .NSM |
%                   .TYPE = (ROD, TUBE, TUBE2, L, I, CHAN, T, BOX, BAR, CROSS, H, T1, I1, CHAN1, Z, CHAN2, T2, BOX1, HEXA, HAT, HAT1, DBOX )
% PSETS (карточка   PBEAM) | .card | .ID | .Patran_name | .MID | .A | .I1 | .I2 | .I12 | .J | .NSM | .C1 | .C2 | .D1 | .D2 | .E1 | .E2 | .F1 | .F2 |
%                          | .N_intermediate_states | .Intermediate_states_data{N_intermediate_states,1} |
%                          | .K1 | .K2 | .S1 | .S2 | .NSI_A | .NSI_B | .CW_A | .CW_B | .M1_A | .M2_A | .M1_B | .M2_B | .N1_A | .N2_A | .N1_B | .N2_B |
%             .Intermediate_states_data{i} : { .SO | .X_XB | .A | .I1 | .I2 | .I12 | .J | .NSM | .C1 | .C2 | .D1 | .D2 | .E1 | .E2 | .F1 | .F2 }
% PSETS (карточка  PBEAML) | .card | .ID | .Patran_name | .MID | .GROUP | .TYPE | .DIM(:,1)| .NSM | .N_intermediate_states | .Intermediate_states_data{N_intermediate_states,1} |
%             .Intermediate_states_data{i} : { .SO | .X_XB | .DIM(:,1)| .NSM }
%                   .TYPE = (ROD, TUBE, TUBE2, L, I, CHAN, T, BOX, BAR, CROSS, H, T1, I1, CHAN1, Z, CHAN2, T2, BOX1, HEXA, HAT, HAT1, DBOX )
% PSETS (карточка  PBCOMP) | .card | .ID | .Patran_name | .MID | .A | .I1 | .I2 | .I12 | .J | .NSM | .K1 | .K2 | .M1 | .M2 | .N1 | .N2 | .SYMOPT | .N_lumped_areas | .Lumped_area_data{N_lumped_areas,1} |
%             .Lumped_area_data{i} : { .Y | .Z | .C | .MID }


global ErrCode;
global AT_MATERIALS;
global AT_COORD;

global BDF_Entity_Read_Settings;

fprintf (1, 'Проверка property sets...               ');

% Установка настроек проверок

switch BDF_Entity_Read_Settings.Read_MATERIALS
    case 'ON'
        Material_Related_Checks = 1;
    case 'OFF'
        Material_Related_Checks = 0;
    otherwise
        fprintf (1, '\nОшибка: непредвиденное значение параметра чтения BDF_Entity_Read_Settings.Read_MATERIALS [%s] !\n', BDF_Entity_Read_Settings.Read_MATERIALS);
        ErrCode = -1;
        return;
end

switch BDF_Entity_Read_Settings.Read_COORD
    case 'ON'
        Coord_Related_Checks = 1;
    case 'OFF'
        Coord_Related_Checks = 0;
    otherwise
        fprintf (1, '\nОшибка: непредвиденное значение параметра чтения BDF_Entity_Read_Settings.Read_COORD [%s] !\n', BDF_Entity_Read_Settings.Read_COORD);
        ErrCode = -1;
        return;
end

if (~isempty(AT_MATERIALS))
    Max_Material_Number = size(AT_MATERIALS,1);
else
    Max_Material_Number = 0;
end

if (~isempty(AT_COORD))
    Max_Coord_Number = size(AT_COORD,1);
else
    Max_Coord_Number = 0;
end

for i=1:size(PSETS,1)
    
    switch upper(PSETS{i}.card)
        
        case 'PSOLID'
            
            % Проверка на допустимость полей карточки
            
            if (~isempty(PSETS{i}.FCTN))
                if (~strcmpi(PSETS{i}.FCTN, 'SMECH'))
                    fprintf (1, '\nОбнаружена запись FCTN, отличная от SMECH, в карточке property set %s с номером %i [%s] !\n', PSETS{i}.Patran_name, PSETS{i}.ID, upper(PSETS{i}.card));
                    fprintf (1, 'Карточки %s c полем FCTN, отличным от SMECH, не поддерживаются в текущей версии программы.\n', upper(PSETS{i}.card));
                    fprintf (1, 'Обратитесь к разработчику для решения этого вопроса.\n');
                    ErrCode = -1;
                    return;
                end
            end
            
            % Проверка на существование материала
            if (Material_Related_Checks == 1)
                if (PSETS{i}.Mat_ID > Max_Material_Number)
                    fprintf (1, '\nProperty set %s с номером %i [%s] ссылается на несуществующий материал %i !\n', PSETS{i}.Patran_name, PSETS{i}.ID, upper(PSETS{i}.card), PSETS{i}.Mat_ID);
                    ErrCode = -1;
                    return;
                end
                if (AT_MATERIALS(PSETS{i}.Mat_ID) == 0)
                    fprintf (1, '\nProperty set %s с номером %i [%s] ссылается на несуществующий материал %i !\n', PSETS{i}.Patran_name, PSETS{i}.ID, upper(PSETS{i}.card), PSETS{i}.Mat_ID);
                    ErrCode = -1;
                    return;
                end
            end
            
            % Проверка на допустимость материала
            
            if (Material_Related_Checks == 1)
                switch upper(MATERIALS{AT_MATERIALS(PSETS{i}.Mat_ID)}.card)

                    case 'MAT1'

                        % Допустимый материал

                    case 'MAT4'

                        fprintf (1, '\nProperty set %s с номером %i [%s] ссылается на материал с карточкой MAT4 !\n', PSETS{i}.Patran_name, PSETS{i}.ID, upper(PSETS{i}.card));
                        fprintf (1, 'Property set %s с материалом MAT4 не поддерживается в текущей версии программы.\n', upper(PSETS{i}.card));
                        fprintf (1, 'Обратитесь к разработчику для решения этого вопроса.\n');
                        ErrCode = -1;
                        return;

                    case 'MAT5'

                        fprintf (1, '\nProperty set %s с номером %i [%s] ссылается на материал с карточкой MAT5 !\n', PSETS{i}.Patran_name, PSETS{i}.ID, upper(PSETS{i}.card));
                        fprintf (1, 'Property set %s с материалом MAT5 не поддерживается в текущей версии программы.\n', upper(PSETS{i}.card));
                        fprintf (1, 'Обратитесь к разработчику для решения этого вопроса.\n');
                        ErrCode = -1;
                        return;

                    case 'MAT9'

                        % Допустимый материал

                    case 'MAT10'

                        fprintf (1, '\nProperty set %s с номером %i [%s] ссылается на материал с карточкой MAT10 !\n', PSETS{i}.Patran_name, PSETS{i}.ID, upper(PSETS{i}.card));
                        fprintf (1, 'Property set %s с материалом MAT10 не поддерживается в текущей версии программы.\n', upper(PSETS{i}.card));
                        fprintf (1, 'Обратитесь к разработчику для решения этого вопроса.\n');
                        ErrCode = -1;
                        return;

                    otherwise

                        fprintf (1, '\nНедопустимая ссылка property set %s с номером %i [%s] на материал с карточкой %s !\n', PSETS{i}.Patran_name, PSETS{i}.ID, upper(PSETS{i}.card), upper(MATERIALS{AT_MATERIALS(PSETS{i}.Mat_ID)}.card));
                        ErrCode = -1;
                        return;

                end
            end
            
            % Проверка на допустимость номера системы координат
            if (Coord_Related_Checks == 1)
                if (PSETS{i}.CORDM < -1)
                    fprintf (1, '\nНедопустимый номер системы координат %i в property set %s с номером %i [%s]  !\n', PSETS{i}.CORDM, PSETS{i}.Patran_name, PSETS{i}.ID, upper(PSETS{i}.card));
                    ErrCode = -1;
                    return;
                end
            end
            
            % Проверка на существование системы координат
            if (Coord_Related_Checks == 1)
                if (PSETS{i}.CORDM > 0)
                    if (PSETS{i}.CORDM > Max_Coord_Number)
                        fprintf (1, '\nProperty set %s с номером %i [%s] ссылается на несуществующую систему координат %i !\n', PSETS{i}.Patran_name, PSETS{i}.ID, upper(PSETS{i}.card), PSETS{i}.CORDM);
                        ErrCode = -1;
                        return;
                    end
                    if (AT_COORD(PSETS{i}.CORDM) == 0)
                        fprintf (1, '\nProperty set %s с номером %i [%s] ссылается на несуществующую систему координат %i !\n', PSETS{i}.Patran_name, PSETS{i}.ID, upper(PSETS{i}.card), PSETS{i}.CORDM);
                        ErrCode = -1;
                        return;
                    end
                end
            end
            
            % Проверка на тип системы координат
            if (Coord_Related_Checks == 1)
                if (PSETS{i}.CORDM > 0)
                    if (~strcmpi(COORD{AT_COORD(PSETS{i}.CORDM)}.card, 'CORD2R'))
                        fprintf (1, '\nProperty set %s с номером %i [%s] ссылается на систему координат %i недопустимого типа [%s] !\n', PSETS{i}.Patran_name, PSETS{i}.ID, upper(PSETS{i}.card), PSETS{i}.CORDM, upper(COORD{AT_COORD(PSETS{i}.CORDM)}.card));
                        fprintf (1, 'Ссылки property set на цилиндрические или сферические системы координат не поддерживаются в текущей версии программы.\n');
                        fprintf (1, 'Обратитесь к разработчику для решения этого вопроса.\n');
                        ErrCode = -1;
                        return;
                    end
                end
            end
            
        case 'PCOMP'
            
            % Проверка на допустимость полей карточки
            
            if (~isempty(PSETS{i}.LAM))
                if (~strcmpi(PSETS{i}.LAM, 'SYM'))
                    fprintf (1, '\nОбнаружено отличное от SYM значение параметра LAM в карточке property set %s с номером %i [%s] !\n', PSETS{i}.Patran_name, PSETS{i}.ID, upper(PSETS{i}.card));
                    fprintf (1, 'Карточки %s c параметром LAM, отличным от SYM, не поддерживаются в текущей версии программы.\n', upper(PSETS{i}.card));
                    fprintf (1, 'Обратитесь к разработчику для решения этого вопроса.\n');
                    ErrCode = -1;
                    return;
                end
            end
            
            if (~isempty(PSETS{i}.GE))
                if (PSETS{i}.GE ~= 0)
                    fprintf (1, '\nОбнаружена ненулевая запись GE в карточке property set %s с номером %i [%s] !\n', PSETS{i}.Patran_name, PSETS{i}.ID, upper(PSETS{i}.card));
                    fprintf (1, 'Карточки %s c ненулевым полем GE не поддерживаются в текущей версии программы.\n', upper(PSETS{i}.card));
                    fprintf (1, 'Обратитесь к разработчику для решения этого вопроса.\n');
                    ErrCode = -1;
                    return;
                end
            end
            
            % Проверка на существование материалов
            if (Material_Related_Checks == 1)
                for j=1:PSETS{i}.N_plies

                    if (PSETS{i}.Laminate(j,1) > Max_Material_Number)
                        fprintf (1, '\nProperty set %s с номером %i [%s] ссылается на несуществующий материал %i !\n', PSETS{i}.Patran_name, PSETS{i}.ID, upper(PSETS{i}.card), PSETS{i}.Laminate(j,1));
                        ErrCode = -1;
                        return;
                    end
                    if (AT_MATERIALS(PSETS{i}.Laminate(j,1)) == 0)
                        fprintf (1, '\nProperty set %s с номером %i [%s] ссылается на несуществующий материал %i !\n', PSETS{i}.Patran_name, PSETS{i}.ID, upper(PSETS{i}.card), PSETS{i}.Laminate(j,1));
                        ErrCode = -1;
                        return;
                    end

                end
            end
            
            % Проверка на допустимость материалов
            if (Material_Related_Checks == 1)
                for j=1:PSETS{i}.N_plies

                    switch upper(MATERIALS{AT_MATERIALS(PSETS{i}.Laminate(j,1))}.card)

                        case 'MAT1'

                            % Допустимый материал

                        case 'MAT2'

                            % Допустимый материал, кроме случая материала MAT2 без G13, G23, G33 для поля MID3 карточки PSHELL

                            if ((MATERIALS{AT_MATERIALS(PSETS{i}.Laminate(j,1))}.G33 == 0) && (MATERIALS{AT_MATERIALS(PSETS{i}.Laminate(j,1))}.G23 == 0) && (MATERIALS{AT_MATERIALS(PSETS{i}.Laminate(j,1))}.G13 == 0))
                                fprintf (1, '\nНедопустимая ссылка property set %s с номером %i [%s] на материал с карточкой %s без полей G13, G23, G33, предназначенный для поля MID3 карточки PSHELL !\n', PSETS{i}.Patran_name, PSETS{i}.ID, upper(PSETS{i}.card), upper(MATERIALS{AT_MATERIALS(PSETS{i}.Laminate(j,1))}.card));
                                ErrCode = -1;
                                return;
                            end

                        case 'MAT8'

                            % Допустимый материал

                        otherwise

                            fprintf (1, '\nНедопустимая ссылка property set %s с номером %i [%s] на материал с карточкой %s !\n', PSETS{i}.Patran_name, PSETS{i}.ID, upper(PSETS{i}.card), upper(MATERIALS{AT_MATERIALS(PSETS{i}.Laminate(j,1))}.card));
                            ErrCode = -1;
                            return;

                    end

                end
            end
            
            % Проверка на допустимость толщин слоев
            for j=1:PSETS{i}.N_plies
            
                if (PSETS{i}.Laminate(j,2) <= 0)
                    fprintf (1, '\nНедопустимая толщина слоя %i в ламинате %s property set %s с номером %i [%s] !\n', j, PSETS{i}.Patran_laminate_name, PSETS{i}.Patran_name, PSETS{i}.ID, upper(PSETS{i}.card));
                    ErrCode = -1;
                    return;
                end
            
            end
            
        case 'PCOMPG'
            
            % Проверка на допустимость полей карточки
            
            if (~isempty(PSETS{i}.LAM))
                fprintf (1, '\nОбнаружена запись LAM в карточке property set %s с номером %i [%s] !\n', PSETS{i}.Patran_name, PSETS{i}.ID, upper(PSETS{i}.card));
                fprintf (1, 'Карточки %s c полем LAM не поддерживаются в текущей версии программы.\n', upper(PSETS{i}.card));
                fprintf (1, 'Обратитесь к разработчику для решения этого вопроса.\n');
                ErrCode = -1;
                return;
            end
            
            if (~isempty(PSETS{i}.GE))
                if (PSETS{i}.GE ~= 0)
                    fprintf (1, '\nОбнаружена ненулевая запись GE в карточке property set %s с номером %i [%s] !\n', PSETS{i}.Patran_name, PSETS{i}.ID, upper(PSETS{i}.card));
                    fprintf (1, 'Карточки %s c ненулевым полем GE не поддерживаются в текущей версии программы.\n', upper(PSETS{i}.card));
                    fprintf (1, 'Обратитесь к разработчику для решения этого вопроса.\n');
                    ErrCode = -1;
                    return;
                end
            end
            
            if (~isempty(PSETS{i}.GEFLG))
                if (PSETS{i}.GEFLG ~= 0)
                    fprintf (1, '\nОбнаружена ненулевая запись GEFLG в карточке property set %s с номером %i [%s] !\n', PSETS{i}.Patran_name, PSETS{i}.ID, upper(PSETS{i}.card));
                    fprintf (1, 'Карточки %s c ненулевым полем GEFLG не поддерживаются в текущей версии программы.\n', upper(PSETS{i}.card));
                    fprintf (1, 'Обратитесь к разработчику для решения этого вопроса.\n');
                    ErrCode = -1;
                    return;
                end
            end
            
            % Проверка на различие глобальных номеров слоев
            
            Global_plies_unique = unique(PSETS{i}.Laminate(:,1));
            
            if (size(Global_plies_unique,1) ~= PSETS{i}.N_plies)
                fprintf (1, '\nОбнаружены повторяющиеся глобальные номера слоев в ламинате %s из property set %s с номером %i [%s] !\n', PSETS{i}.Patran_laminate_name, PSETS{i}.Patran_name, PSETS{i}.ID, upper(PSETS{i}.card));
                ErrCode = -1;
                return;
            end
            
            % Проверка на существование материалов
            if (Material_Related_Checks == 1)
                for j=1:PSETS{i}.N_plies

                    if (PSETS{i}.Laminate(j,2) > Max_Material_Number)
                        fprintf (1, '\nProperty set %s с номером %i [%s] ссылается на несуществующий материал %i !\n', PSETS{i}.Patran_name, PSETS{i}.ID, upper(PSETS{i}.card), PSETS{i}.Laminate(j,2));
                        ErrCode = -1;
                        return;
                    end
                    if (AT_MATERIALS(PSETS{i}.Laminate(j,2)) == 0)
                        fprintf (1, '\nProperty set %s с номером %i [%s] ссылается на несуществующий материал %i !\n', PSETS{i}.Patran_name, PSETS{i}.ID, upper(PSETS{i}.card), PSETS{i}.Laminate(j,2));
                        ErrCode = -1;
                        return;
                    end

                end
            end
            
            % Проверка на допустимость материалов
            if (Material_Related_Checks == 1)
                for j=1:PSETS{i}.N_plies

                    switch upper(MATERIALS{AT_MATERIALS(PSETS{i}.Laminate(j,2))}.card)

                        case 'MAT1'

                            % Допустимый материал

                        case 'MAT2'

                            % Допустимый материал, кроме случая материала MAT2 без G13, G23, G33 для поля MID3 карточки PSHELL

                            if ((MATERIALS{AT_MATERIALS(PSETS{i}.Laminate(j,2))}.G33 == 0) && (MATERIALS{AT_MATERIALS(PSETS{i}.Laminate(j,2))}.G23 == 0) && (MATERIALS{AT_MATERIALS(PSETS{i}.Laminate(j,2))}.G13 == 0))
                                fprintf (1, '\nНедопустимая ссылка property set %s с номером %i [%s] на материал с карточкой %s без полей G13, G23, G33, предназначенный для поля MID3 карточки PSHELL !\n', PSETS{i}.Patran_name, PSETS{i}.ID, upper(PSETS{i}.card), upper(MATERIALS{AT_MATERIALS(PSETS{i}.Laminate(j,2))}.card));
                                ErrCode = -1;
                                return;
                            end

                        case 'MAT8'

                            % Допустимый материал

                        otherwise

                            fprintf (1, '\nНедопустимая ссылка property set %s с номером %i [%s] на материал с карточкой %s !\n', PSETS{i}.Patran_name, PSETS{i}.ID, upper(PSETS{i}.card), upper(MATERIALS{AT_MATERIALS(PSETS{i}.Laminate(j,2))}.card));
                            ErrCode = -1;
                            return;

                    end

                end
            end
            
            % Проверка на допустимость толщин слоев
            for j=1:PSETS{i}.N_plies
            
                if (PSETS{i}.Laminate(j,3) <= 0)
                    fprintf (1, '\nНедопустимая толщина слоя %i в ламинате %s property set %s с номером %i [%s] !\n', j, PSETS{i}.Patran_laminate_name, PSETS{i}.Patran_name, PSETS{i}.ID, upper(PSETS{i}.card));
                    ErrCode = -1;
                    return;
                end
            
            end
            
        case 'PSHELL'
            
            % Проверка на присутствие или отсутствие полей карточки
                        
            if (~isempty(PSETS{i}.MID4))
                fprintf (1, '\nОбнаружена запись MID4 в карточке property set %s с номером %i [%s] !\n', PSETS{i}.Patran_name, PSETS{i}.ID, upper(PSETS{i}.card));
                fprintf (1, 'Карточки %s c полем MID4 не поддерживаются в текущей версии программы.\n', upper(PSETS{i}.card));
                fprintf (1, 'Обратитесь к разработчику для решения этого вопроса.\n');
                ErrCode = -1;
                return;
            end
                        
            if (isempty(PSETS{i}.MID1))
                fprintf (1, '\nПустое поле MID1 в карточке property set %s с номером %i [%s] !\n', PSETS{i}.Patran_name, PSETS{i}.ID, upper(PSETS{i}.card));
                fprintf (1, 'Карточки %s без поля MID1 не поддерживаются в текущей версии программы.\n', upper(PSETS{i}.card));
                fprintf (1, 'Обратитесь к разработчику для решения этого вопроса.\n');
                ErrCode = -1;
                return;
            end
            
            if (isempty(PSETS{i}.MID2))
                fprintf (1, '\nПустое поле MID2 в карточке property set %s с номером %i [%s] !\n', PSETS{i}.Patran_name, PSETS{i}.ID, upper(PSETS{i}.card));
                fprintf (1, 'Карточки %s без поля MID2 не поддерживаются в текущей версии программы.\n', upper(PSETS{i}.card));
                fprintf (1, 'Обратитесь к разработчику для решения этого вопроса.\n');
                ErrCode = -1;
                return;
            end
            
            if (isempty(PSETS{i}.MID3))
                fprintf (1, '\nПустое поле MID3 в карточке property set %s с номером %i [%s] !\n', PSETS{i}.Patran_name, PSETS{i}.ID, upper(PSETS{i}.card));
                fprintf (1, 'Карточки %s без поля MID3 не поддерживаются в текущей версии программы.\n', upper(PSETS{i}.card));
                fprintf (1, 'Обратитесь к разработчику для решения этого вопроса.\n');
                ErrCode = -1;
                return;
            end
            
            if (isempty(PSETS{i}.T))
                fprintf (1, '\nПустое поле T в карточке property set %s с номером %i [%s] !\n', PSETS{i}.Patran_name, PSETS{i}.ID, upper(PSETS{i}.card));
                fprintf (1, 'Карточки %s без поля T не поддерживаются в текущей версии программы.\n', upper(PSETS{i}.card));
                fprintf (1, 'Обратитесь к разработчику для решения этого вопроса.\n');
                ErrCode = -1;
                return;
            end
            
            % Проверка на допустимость значений полей
            
            if (~isempty(PSETS{i}.I_ratio))
                if (PSETS{i}.I_ratio ~= 1)
                    fprintf (1, '\nОбнаружено отличное от 1 значение параметра 12I/T**3 в карточке property set %s с номером %i [%s] !\n', PSETS{i}.Patran_name, PSETS{i}.ID, upper(PSETS{i}.card));
                    fprintf (1, 'Отличные от 1 значения параметра 12I/T**3 в карточке %s не поддерживаются в текущей версии программы.\n', upper(PSETS{i}.card));
                    fprintf (1, 'Обратитесь к разработчику для решения этого вопроса.\n');
                    ErrCode = -1;
                    return;
                end
            end
            
            if (~isempty(PSETS{i}.TS_T))
                if (abs(PSETS{i}.TS_T - 0.833333) >= 0.000001)
                    fprintf (1, '\nОбнаружено отличное от 0.833333 значение параметра TS/T в карточке property set %s с номером %i [%s] !\n', PSETS{i}.Patran_name, PSETS{i}.ID, upper(PSETS{i}.card));
                    fprintf (1, 'Отличные от 0.833333 значения параметра TS/T в карточке %s не поддерживаются в текущей версии программы.\n', upper(PSETS{i}.card));
                    fprintf (1, 'Обратитесь к разработчику для решения этого вопроса.\n');
                    ErrCode = -1;
                    return;
                end
            end
            
            if (PSETS{i}.T <= 0)
                fprintf (1, '\nНедопустимая толщина пластины в property set %s с номером %i [%s] !\n', PSETS{i}.Patran_name, PSETS{i}.ID, upper(PSETS{i}.card));
                ErrCode = -1;
                return;
            end
            
            % Проверка на допустимость значения номера материала
            
            if (Material_Related_Checks == 1)
            
                if (PSETS{i}.MID1 == 0)
                    fprintf (1, '\nНедопустимый номер материала MAT1 в property set %s с номером %i [%s] !\n', PSETS{i}.Patran_name, PSETS{i}.ID, upper(PSETS{i}.card));
                    fprintf (1, 'MAT1 = 0 в карточке %s не поддерживаются в текущей версии программы.\n', upper(PSETS{i}.card));
                    fprintf (1, 'Обратитесь к разработчику для решения этого вопроса.\n');
                    ErrCode = -1;
                    return;
                end

                if (~isempty(PSETS{i}.MID2))

                    if (PSETS{i}.MID2 == 0)
                        fprintf (1, '\nНедопустимый номер материала MID2 в property set %s с номером %i [%s] !\n', PSETS{i}.Patran_name, PSETS{i}.ID, upper(PSETS{i}.card));
                        fprintf (1, 'MID2 = 0 в карточке %s не поддерживается в текущей версии программы.\n', upper(PSETS{i}.card));
                        fprintf (1, 'Обратитесь к разработчику для решения этого вопроса.\n');
                        ErrCode = -1;
                        return;
                    end

                    if (PSETS{i}.MID2 == -1)
                        fprintf (1, '\nНедопустимый номер материала MID2 в property set %s с номером %i [%s] !\n', PSETS{i}.Patran_name, PSETS{i}.ID, upper(PSETS{i}.card));
                        fprintf (1, 'MID2 = -1 (указатель плоского деформированного состояния) в карточке %s не поддерживается в текущей версии программы.\n', upper(PSETS{i}.card));
                        fprintf (1, 'Обратитесь к разработчику для решения этого вопроса.\n');
                        ErrCode = -1;
                        return;
                    end

                end
            
            end
            
            % Проверка на существование материала
            
            if (Material_Related_Checks == 1)
            
                if (PSETS{i}.MID1 > Max_Material_Number)
                    fprintf (1, '\nProperty set %s с номером %i [%s] ссылается на несуществующий материал %i !\n', PSETS{i}.Patran_name, PSETS{i}.ID, upper(PSETS{i}.card), PSETS{i}.MID1);
                    ErrCode = -1;
                    return;
                end
                if (AT_MATERIALS(PSETS{i}.MID1) == 0)
                    fprintf (1, '\nProperty set %s с номером %i [%s] ссылается на несуществующий материал %i !\n', PSETS{i}.Patran_name, PSETS{i}.ID, upper(PSETS{i}.card), PSETS{i}.MID1);
                    ErrCode = -1;
                    return;
                end

                if (~isempty(PSETS{i}.MID2))

                    if (PSETS{i}.MID2 > Max_Material_Number)
                        fprintf (1, '\nProperty set %s с номером %i [%s] ссылается на несуществующий материал %i !\n', PSETS{i}.Patran_name, PSETS{i}.ID, upper(PSETS{i}.card), PSETS{i}.MID2);
                        ErrCode = -1;
                        return;
                    end
                    if (AT_MATERIALS(PSETS{i}.MID2) == 0)
                        fprintf (1, '\nProperty set %s с номером %i [%s] ссылается на несуществующий материал %i !\n', PSETS{i}.Patran_name, PSETS{i}.ID, upper(PSETS{i}.card), PSETS{i}.MID2);
                        ErrCode = -1;
                        return;
                    end

                end

                if (~isempty(PSETS{i}.MID3))

                    if (PSETS{i}.MID3 > Max_Material_Number)
                        fprintf (1, '\nProperty set %s с номером %i [%s] ссылается на несуществующий материал %i !\n', PSETS{i}.Patran_name, PSETS{i}.ID, upper(PSETS{i}.card), PSETS{i}.MID3);
                        ErrCode = -1;
                        return;
                    end
                    if (AT_MATERIALS(PSETS{i}.MID3) == 0)
                        fprintf (1, '\nProperty set %s с номером %i [%s] ссылается на несуществующий материал %i !\n', PSETS{i}.Patran_name, PSETS{i}.ID, upper(PSETS{i}.card), PSETS{i}.MID3);
                        ErrCode = -1;
                        return;
                    end

                end
            
            end
            
            % Проверка на допустимость материала
            
            if (Material_Related_Checks == 1)
            
                switch upper(MATERIALS{AT_MATERIALS(PSETS{i}.MID1)}.card)

                    case 'MAT1'

                        % Допустимый материал

                    case 'MAT2'

                        % Допустимый материал, кроме случая материала MAT2 без G13, G23, G33 для поля MID3 карточки PSHELL

                        if ((MATERIALS{AT_MATERIALS(PSETS{i}.MID1)}.G33 == 0) && (MATERIALS{AT_MATERIALS(PSETS{i}.MID1)}.G23 == 0) && (MATERIALS{AT_MATERIALS(PSETS{i}.MID1)}.G13 == 0))
                            fprintf (1, '\nНедопустимая ссылка property set %s с номером %i [%s] на материал с карточкой %s без полей G13, G23, G33, предназначенный для поля MID3 карточки PSHELL !\n', PSETS{i}.Patran_name, PSETS{i}.ID, upper(PSETS{i}.card), upper(MATERIALS{AT_MATERIALS(PSETS{i}.MID1)}.card));
                            ErrCode = -1;
                            return;
                        end

                    case 'MAT8'

                        % Допустимый материал

                    otherwise

                        fprintf (1, '\nНедопустимая ссылка property set %s с номером %i [%s] на материал с карточкой %s !\n', PSETS{i}.Patran_name, PSETS{i}.ID, upper(PSETS{i}.card), upper(MATERIALS{AT_MATERIALS(PSETS{i}.MID1)}.card));
                        ErrCode = -1;
                        return;

                end

                if (~isempty(PSETS{i}.MID2))

                    switch upper(MATERIALS{AT_MATERIALS(PSETS{i}.MID2)}.card)

                        case 'MAT1'

                            % Допустимый материал

                        case 'MAT2'

                            % Допустимый материал, кроме случая материала MAT2 без G13, G23, G33 для поля MID3 карточки PSHELL

                            if ((MATERIALS{AT_MATERIALS(PSETS{i}.MID2)}.G33 == 0) && (MATERIALS{AT_MATERIALS(PSETS{i}.MID2)}.G23 == 0) && (MATERIALS{AT_MATERIALS(PSETS{i}.MID2)}.G13 == 0))
                                fprintf (1, '\nНедопустимая ссылка property set %s с номером %i [%s] на материал с карточкой %s без полей G13, G23, G33, предназначенный для поля MID3 карточки PSHELL !\n', PSETS{i}.Patran_name, PSETS{i}.ID, upper(PSETS{i}.card), upper(MATERIALS{AT_MATERIALS(PSETS{i}.MID2)}.card));
                                ErrCode = -1;
                                return;
                            end

                        case 'MAT8'

                            % Допустимый материал

                        otherwise

                            fprintf (1, '\nНедопустимая ссылка property set %s с номером %i [%s] на материал с карточкой %s !\n', PSETS{i}.Patran_name, PSETS{i}.ID, upper(PSETS{i}.card), upper(MATERIALS{AT_MATERIALS(PSETS{i}.MID2)}.card));
                            ErrCode = -1;
                            return;

                    end

                end

                if (~isempty(PSETS{i}.MID3))

                    switch upper(MATERIALS{AT_MATERIALS(PSETS{i}.MID3)}.card)

                        case 'MAT1'

                            % Допустимый материал

                        case 'MAT2'

                            % Допустимый материал

                        case 'MAT8'

                            % Допустимый материал

                        otherwise

                            fprintf (1, '\nНедопустимая ссылка property set %s с номером %i [%s] на материал с карточкой %s !\n', PSETS{i}.Patran_name, PSETS{i}.ID, upper(PSETS{i}.card), upper(MATERIALS{AT_MATERIALS(PSETS{i}.MID3)}.card));
                            ErrCode = -1;
                            return;

                    end

                end
            
            end
            
        case 'PBUSH'
            
            % Проверка на присутствие или отсутствие полей карточки
            
            if (isempty(PSETS{i}.K))
                fprintf (1, '\nНе обнаружено строки с флагом K в карточке property set %s с номером %i [%s] !\n', PSETS{i}.Patran_name, PSETS{i}.ID, upper(PSETS{i}.card));
                fprintf (1, 'Карточки %s без строки с флагом K не поддерживаются в текущей версии программы.\n', upper(PSETS{i}.card));
                fprintf (1, 'Обратитесь к разработчику для решения этого вопроса.\n');
                ErrCode = -1;
                return;
            end
            
            if (~isempty(PSETS{i}.B))
                fprintf (1, '\nОбнаружены записи в строке с флагом B в карточке property set %s с номером %i [%s] !\n', PSETS{i}.Patran_name, PSETS{i}.ID, upper(PSETS{i}.card));
                fprintf (1, 'Карточки %s c флагом B не поддерживаются в текущей версии программы.\n', upper(PSETS{i}.card));
                fprintf (1, 'Обратитесь к разработчику для решения этого вопроса.\n');
                ErrCode = -1;
                return;
            end
            
            if (~isempty(PSETS{i}.GE))
                for p=1:size(PSETS{i}.GE, 1)
                    if (PSETS{i}.GE(p) ~= 0)
                        fprintf (1, '\nОбнаружены ненулевые значения параметров в строке с флагом GE в карточке property set %s с номером %i [%s] !\n', PSETS{i}.Patran_name, PSETS{i}.ID, upper(PSETS{i}.card));
                        fprintf (1, 'Ненулевые значения параметров в строке GE карточки %s не поддерживаются в текущей версии программы.\n', upper(PSETS{i}.card));
                        fprintf (1, 'Обратитесь к разработчику для решения этого вопроса.\n');
                        ErrCode = -1;
                        return;
                    end
                end
            end
            
            if (~isempty(PSETS{i}.RCV))
                if (~isempty(PSETS{i}.RCV.SA))
                    if (PSETS{i}.RCV.SA ~= 1)
                        fprintf (1, '\nОбнаружено отличное от 1 значение параметра SA в карточке property set %s с номером %i [%s] !\n', PSETS{i}.Patran_name, PSETS{i}.ID, upper(PSETS{i}.card));
                        fprintf (1, 'Отличные от 1 значения параметра SA в карточке %s не поддерживаются в текущей версии программы.\n', upper(PSETS{i}.card));
                        fprintf (1, 'Обратитесь к разработчику для решения этого вопроса.\n');
                        ErrCode = -1;
                        return;
                    end
                end
                if (~isempty(PSETS{i}.RCV.ST))
                    if (PSETS{i}.RCV.ST ~= 1)
                        fprintf (1, '\nОбнаружено отличное от 1 значение параметра ST в карточке property set %s с номером %i [%s] !\n', PSETS{i}.Patran_name, PSETS{i}.ID, upper(PSETS{i}.card));
                        fprintf (1, 'Отличные от 1 значения параметра ST в карточке %s не поддерживаются в текущей версии программы.\n', upper(PSETS{i}.card));
                        fprintf (1, 'Обратитесь к разработчику для решения этого вопроса.\n');
                        ErrCode = -1;
                        return;
                    end
                end
                if (~isempty(PSETS{i}.RCV.EA))
                    if (PSETS{i}.RCV.EA ~= 1)
                        fprintf (1, '\nОбнаружено отличное от 1 значение параметра EA в карточке property set %s с номером %i [%s] !\n', PSETS{i}.Patran_name, PSETS{i}.ID, upper(PSETS{i}.card));
                        fprintf (1, 'Отличные от 1 значения параметра EA в карточке %s не поддерживаются в текущей версии программы.\n', upper(PSETS{i}.card));
                        fprintf (1, 'Обратитесь к разработчику для решения этого вопроса.\n');
                        ErrCode = -1;
                        return;
                    end
                end
                if (~isempty(PSETS{i}.RCV.ET))
                    if (PSETS{i}.RCV.ET ~= 1)
                        fprintf (1, '\nОбнаружено отличное от 1 значение параметра ET в карточке property set %s с номером %i [%s] !\n', PSETS{i}.Patran_name, PSETS{i}.ID, upper(PSETS{i}.card));
                        fprintf (1, 'Отличные от 1 значения параметра ET в карточке %s не поддерживаются в текущей версии программы.\n', upper(PSETS{i}.card));
                        fprintf (1, 'Обратитесь к разработчику для решения этого вопроса.\n');
                        ErrCode = -1;
                        return;
                    end
                end
            end
            
            % Проверка на правильность значений K
            for p=1:size(PSETS{i}.K, 1)
                if (PSETS{i}.K(p) < 0)
                    fprintf (1, '\nОбнаружены неправильные значения параметров в строке с флагом K в карточке property set %s с номером %i [%s] !\n', PSETS{i}.Patran_name, PSETS{i}.ID, upper(PSETS{i}.card));
                    ErrCode = -1;
                    return;
                end
            end
            
        case 'PROD'
            
            % Проверка на присутствие или отсутствие полей карточки
            
            if (isempty(PSETS{i}.A))
                fprintf (1, '\nПустое поле A в карточке property set %s с номером %i [%s] !\n', PSETS{i}.Patran_name, PSETS{i}.ID, upper(PSETS{i}.card));
                fprintf (1, 'Карточки %s с пустым полем A не поддерживаются в текущей версии программы.\n', upper(PSETS{i}.card));
                fprintf (1, 'Обратитесь к разработчику для решения этого вопроса.\n');
                ErrCode = -1;
                return;
            end
            
            % Проверка на допустимость значений
            
            if (PSETS{i}.A <= 0)
                fprintf (1, '\nНедопустимое значение параметра A в property set %s с номером %i [%s] !\n', PSETS{i}.Patran_name, PSETS{i}.ID, upper(PSETS{i}.card));
                ErrCode = -1;
                return;
            end
            
            if (~isempty(PSETS{i}.J))
                if (PSETS{i}.J <= 0)
                    fprintf (1, '\nНедопустимое значение параметра J в property set %s с номером %i [%s] !\n', PSETS{i}.Patran_name, PSETS{i}.ID, upper(PSETS{i}.card));
                    ErrCode = -1;
                    return;
                end
            end
            
            % Проверка на существование материала
            
            if (Material_Related_Checks == 1)
            
                if (PSETS{i}.MID > Max_Material_Number)
                    fprintf (1, '\nProperty set %s с номером %i [%s] ссылается на несуществующий материал %i !\n', PSETS{i}.Patran_name, PSETS{i}.ID, upper(PSETS{i}.card), PSETS{i}.MID);
                    ErrCode = -1;
                    return;
                end
                if (AT_MATERIALS(PSETS{i}.MID) == 0)
                    fprintf (1, '\nProperty set %s с номером %i [%s] ссылается на несуществующий материал %i !\n', PSETS{i}.Patran_name, PSETS{i}.ID, upper(PSETS{i}.card), PSETS{i}.MID);
                    ErrCode = -1;
                    return;
                end
            
            end
            
            % Проверка на допустимость материала
            
            if (Material_Related_Checks == 1)
            
                switch upper(MATERIALS{AT_MATERIALS(PSETS{i}.MID)}.card)

                    case 'MAT1'

                        % Допустимый материал

                    case 'MAT4'

                        fprintf (1, '\nProperty set %s с номером %i [%s] ссылается на материал с карточкой MAT4 !\n', PSETS{i}.Patran_name, PSETS{i}.ID, upper(PSETS{i}.card));
                        fprintf (1, 'Property set %s с материалом MAT4 не поддерживается в текущей версии программы.\n', upper(PSETS{i}.card));
                        fprintf (1, 'Обратитесь к разработчику для решения этого вопроса.\n');
                        ErrCode = -1;
                        return;

                    case 'MAT5'

                        fprintf (1, '\nProperty set %s с номером %i [%s] ссылается на материал с карточкой MAT5 !\n', PSETS{i}.Patran_name, PSETS{i}.ID, upper(PSETS{i}.card));
                        fprintf (1, 'Property set %s с материалом MAT5 не поддерживается в текущей версии программы.\n', upper(PSETS{i}.card));
                        fprintf (1, 'Обратитесь к разработчику для решения этого вопроса.\n');
                        ErrCode = -1;
                        return;

                    otherwise

                        fprintf (1, '\nНедопустимая ссылка property set %s с номером %i [%s] на материал с карточкой %s !\n', PSETS{i}.Patran_name, PSETS{i}.ID, upper(PSETS{i}.card), upper(MATERIALS{AT_MATERIALS(PSETS{i}.MID)}.card));
                        ErrCode = -1;
                        return;

                end
            
            end
            
        case 'PBMSECT'
            
            % Проверка на присутствие или отсутствие полей карточки
            
            if (isempty(PSETS{i}.FORM))
                fprintf (1, '\nПустое поле FORM в карточке property set %s с номером %i [%s] !\n', PSETS{i}.Patran_name, PSETS{i}.ID, upper(PSETS{i}.card));
                fprintf (1, 'Карточки %s с пустым полем FORM не поддерживаются в текущей версии программы.\n', upper(PSETS{i}.card));
                fprintf (1, 'Обратитесь к разработчику для решения этого вопроса.\n');
                ErrCode = -1;
                return;
            end
            
            if (isempty(PSETS{i}.Section_data))
                fprintf (1, '\nПустое поле Section_data в карточке property set %s с номером %i [%s] !\n', PSETS{i}.Patran_name, PSETS{i}.ID, upper(PSETS{i}.card));
                fprintf (1, 'Карточки %s с пустым полем Section_data не поддерживаются в текущей версии программы.\n', upper(PSETS{i}.card));
                fprintf (1, 'Обратитесь к разработчику для решения этого вопроса.\n');
                ErrCode = -1;
                return;
            end
            
            % Проверка на существование материала
            
            if (Material_Related_Checks == 1)
            
                if (PSETS{i}.MID > Max_Material_Number)
                    fprintf (1, '\nProperty set %s с номером %i [%s] ссылается на несуществующий материал %i !\n', PSETS{i}.Patran_name, PSETS{i}.ID, upper(PSETS{i}.card), PSETS{i}.MID);
                    ErrCode = -1;
                    return;
                end
                if (AT_MATERIALS(PSETS{i}.MID) == 0)
                    fprintf (1, '\nProperty set %s с номером %i [%s] ссылается на несуществующий материал %i !\n', PSETS{i}.Patran_name, PSETS{i}.ID, upper(PSETS{i}.card), PSETS{i}.MID);
                    ErrCode = -1;
                    return;
                end
            
            end
            
            % Проверка на допустимость материала
            
            if (Material_Related_Checks == 1)
            
                switch upper(MATERIALS{AT_MATERIALS(PSETS{i}.MID)}.card)

                    case 'MAT1'

                        % Допустимый материал

                    case 'MAT4'

                        fprintf (1, '\nProperty set %s с номером %i [%s] ссылается на материал с карточкой MAT4 !\n', PSETS{i}.Patran_name, PSETS{i}.ID, upper(PSETS{i}.card));
                        fprintf (1, 'Property set %s с материалом MAT4 не поддерживается в текущей версии программы.\n', upper(PSETS{i}.card));
                        fprintf (1, 'Обратитесь к разработчику для решения этого вопроса.\n');
                        ErrCode = -1;
                        return;

                    case 'MAT5'

                        fprintf (1, '\nProperty set %s с номером %i [%s] ссылается на материал с карточкой MAT5 !\n', PSETS{i}.Patran_name, PSETS{i}.ID, upper(PSETS{i}.card));
                        fprintf (1, 'Property set %s с материалом MAT5 не поддерживается в текущей версии программы.\n', upper(PSETS{i}.card));
                        fprintf (1, 'Обратитесь к разработчику для решения этого вопроса.\n');
                        ErrCode = -1;
                        return;

                    otherwise

                        fprintf (1, '\nНедопустимая ссылка property set %s с номером %i [%s] на материал с карточкой %s !\n', PSETS{i}.Patran_name, PSETS{i}.ID, upper(PSETS{i}.card), upper(MATERIALS{AT_MATERIALS(PSETS{i}.MID)}.card));
                        ErrCode = -1;
                        return;

                end
            
            end
            
        case 'PBRSECT'
            
            % Проверка на присутствие или отсутствие полей карточки
            
            if (isempty(PSETS{i}.FORM))
                fprintf (1, '\nПустое поле FORM в карточке property set %s с номером %i [%s] !\n', PSETS{i}.Patran_name, PSETS{i}.ID, upper(PSETS{i}.card));
                fprintf (1, 'Карточки %s с пустым полем FORM не поддерживаются в текущей версии программы.\n', upper(PSETS{i}.card));
                fprintf (1, 'Обратитесь к разработчику для решения этого вопроса.\n');
                ErrCode = -1;
                return;
            end
            
            if (isempty(PSETS{i}.Section_data))
                fprintf (1, '\nПустое поле Section_data в карточке property set %s с номером %i [%s] !\n', PSETS{i}.Patran_name, PSETS{i}.ID, upper(PSETS{i}.card));
                fprintf (1, 'Карточки %s с пустым полем Section_data не поддерживаются в текущей версии программы.\n', upper(PSETS{i}.card));
                fprintf (1, 'Обратитесь к разработчику для решения этого вопроса.\n');
                ErrCode = -1;
                return;
            end
            
            % Проверка на существование материала
            
            if (Material_Related_Checks == 1)
            
                if (PSETS{i}.MID > Max_Material_Number)
                    fprintf (1, '\nProperty set %s с номером %i [%s] ссылается на несуществующий материал %i !\n', PSETS{i}.Patran_name, PSETS{i}.ID, upper(PSETS{i}.card), PSETS{i}.MID);
                    ErrCode = -1;
                    return;
                end
                if (AT_MATERIALS(PSETS{i}.MID) == 0)
                    fprintf (1, '\nProperty set %s с номером %i [%s] ссылается на несуществующий материал %i !\n', PSETS{i}.Patran_name, PSETS{i}.ID, upper(PSETS{i}.card), PSETS{i}.MID);
                    ErrCode = -1;
                    return;
                end
            
            end
            
            % Проверка на допустимость материала
            
            if (Material_Related_Checks == 1)
            
                switch upper(MATERIALS{AT_MATERIALS(PSETS{i}.MID)}.card)

                    case 'MAT1'

                        % Допустимый материал

                    case 'MAT4'

                        fprintf (1, '\nProperty set %s с номером %i [%s] ссылается на материал с карточкой MAT4 !\n', PSETS{i}.Patran_name, PSETS{i}.ID, upper(PSETS{i}.card));
                        fprintf (1, 'Property set %s с материалом MAT4 не поддерживается в текущей версии программы.\n', upper(PSETS{i}.card));
                        fprintf (1, 'Обратитесь к разработчику для решения этого вопроса.\n');
                        ErrCode = -1;
                        return;

                    case 'MAT5'

                        fprintf (1, '\nProperty set %s с номером %i [%s] ссылается на материал с карточкой MAT5 !\n', PSETS{i}.Patran_name, PSETS{i}.ID, upper(PSETS{i}.card));
                        fprintf (1, 'Property set %s с материалом MAT5 не поддерживается в текущей версии программы.\n', upper(PSETS{i}.card));
                        fprintf (1, 'Обратитесь к разработчику для решения этого вопроса.\n');
                        ErrCode = -1;
                        return;

                    otherwise

                        fprintf (1, '\nНедопустимая ссылка property set %s с номером %i [%s] на материал с карточкой %s !\n', PSETS{i}.Patran_name, PSETS{i}.ID, upper(PSETS{i}.card), upper(MATERIALS{AT_MATERIALS(PSETS{i}.MID)}.card));
                        ErrCode = -1;
                        return;

                end
            
            end
            
        case 'PBAR'
            
            % Проверка на присутствие или отсутствие полей карточки
            
            if (isempty(PSETS{i}.A))
                fprintf (1, '\nПустое поле A в карточке property set %s с номером %i [%s] !\n', PSETS{i}.Patran_name, PSETS{i}.ID, upper(PSETS{i}.card));
                fprintf (1, 'Карточки %s с пустым полем A не поддерживаются в текущей версии программы.\n', upper(PSETS{i}.card));
                fprintf (1, 'Обратитесь к разработчику для решения этого вопроса.\n');
                ErrCode = -1;
                return;
            end
            
            if (isempty(PSETS{i}.I1))
                fprintf (1, '\nПустое поле I1 в карточке property set %s с номером %i [%s] !\n', PSETS{i}.Patran_name, PSETS{i}.ID, upper(PSETS{i}.card));
                fprintf (1, 'Карточки %s с пустым полем I1 не поддерживаются в текущей версии программы.\n', upper(PSETS{i}.card));
                fprintf (1, 'Обратитесь к разработчику для решения этого вопроса.\n');
                ErrCode = -1;
                return;
            end
            
            if (isempty(PSETS{i}.I2))
                fprintf (1, '\nПустое поле I2 в карточке property set %s с номером %i [%s] !\n', PSETS{i}.Patran_name, PSETS{i}.ID, upper(PSETS{i}.card));
                fprintf (1, 'Карточки %s с пустым полем I2 не поддерживаются в текущей версии программы.\n', upper(PSETS{i}.card));
                fprintf (1, 'Обратитесь к разработчику для решения этого вопроса.\n');
                ErrCode = -1;
                return;
            end
            
            if (isempty(PSETS{i}.J))
                fprintf (1, '\nПустое поле J в карточке property set %s с номером %i [%s] !\n', PSETS{i}.Patran_name, PSETS{i}.ID, upper(PSETS{i}.card));
                fprintf (1, 'Карточки %s с пустым полем J не поддерживаются в текущей версии программы.\n', upper(PSETS{i}.card));
                fprintf (1, 'Обратитесь к разработчику для решения этого вопроса.\n');
                ErrCode = -1;
                return;
            end
            
            % Проверка на допустимость значений
            
            if (PSETS{i}.A <= 0)
                fprintf (1, '\nНедопустимое значение параметра A в property set %s с номером %i [%s] !\n', PSETS{i}.Patran_name, PSETS{i}.ID, upper(PSETS{i}.card));
                ErrCode = -1;
                return;
            end
            
            if (PSETS{i}.I1 <= 0)
                fprintf (1, '\nНедопустимое значение параметра I1 в property set %s с номером %i [%s] !\n', PSETS{i}.Patran_name, PSETS{i}.ID, upper(PSETS{i}.card));
                ErrCode = -1;
                return;
            end
            
            if (PSETS{i}.I2 <= 0)
                fprintf (1, '\nНедопустимое значение параметра I2 в property set %s с номером %i [%s] !\n', PSETS{i}.Patran_name, PSETS{i}.ID, upper(PSETS{i}.card));
                ErrCode = -1;
                return;
            end
            
            if (~isempty(PSETS{i}.I12))
                if (PSETS{i}.I1 * PSETS{i}.I2 < PSETS{i}.I12 * PSETS{i}.I12)
                    fprintf (1, '\nОшибка: не выполнено условие I1*I2 >= (I12)^2 в property set %s с номером %i [%s] !\n', PSETS{i}.Patran_name, PSETS{i}.ID, upper(PSETS{i}.card));
                    fprintf (1, 'Отредактируйте property set в базе с моделью.\n');
                    ErrCode = -1;
                    return;
                end
            end
            
            if (PSETS{i}.J <= 0)
                fprintf (1, '\nНедопустимое значение параметра J в property set %s с номером %i [%s] !\n', PSETS{i}.Patran_name, PSETS{i}.ID, upper(PSETS{i}.card));
                ErrCode = -1;
                return;
            end
            
            % Проверка на существование материала
            
            if (Material_Related_Checks == 1)
            
                if (PSETS{i}.MID > Max_Material_Number)
                    fprintf (1, '\nProperty set %s с номером %i [%s] ссылается на несуществующий материал %i !\n', PSETS{i}.Patran_name, PSETS{i}.ID, upper(PSETS{i}.card), PSETS{i}.MID);
                    ErrCode = -1;
                    return;
                end
                if (AT_MATERIALS(PSETS{i}.MID) == 0)
                    fprintf (1, '\nProperty set %s с номером %i [%s] ссылается на несуществующий материал %i !\n', PSETS{i}.Patran_name, PSETS{i}.ID, upper(PSETS{i}.card), PSETS{i}.MID);
                    ErrCode = -1;
                    return;
                end
            
            end
            
            % Проверка на допустимость материала
            
            if (Material_Related_Checks == 1)
            
                switch upper(MATERIALS{AT_MATERIALS(PSETS{i}.MID)}.card)

                    case 'MAT1'

                        % Допустимый материал

                    case 'MAT4'

                        fprintf (1, '\nProperty set %s с номером %i [%s] ссылается на материал с карточкой MAT4 !\n', PSETS{i}.Patran_name, PSETS{i}.ID, upper(PSETS{i}.card));
                        fprintf (1, 'Property set %s с материалом MAT4 не поддерживается в текущей версии программы.\n', upper(PSETS{i}.card));
                        fprintf (1, 'Обратитесь к разработчику для решения этого вопроса.\n');
                        ErrCode = -1;
                        return;

                    case 'MAT5'

                        fprintf (1, '\nProperty set %s с номером %i [%s] ссылается на материал с карточкой MAT5 !\n', PSETS{i}.Patran_name, PSETS{i}.ID, upper(PSETS{i}.card));
                        fprintf (1, 'Property set %s с материалом MAT5 не поддерживается в текущей версии программы.\n', upper(PSETS{i}.card));
                        fprintf (1, 'Обратитесь к разработчику для решения этого вопроса.\n');
                        ErrCode = -1;
                        return;

                    otherwise

                        fprintf (1, '\nНедопустимая ссылка property set %s с номером %i [%s] на материал с карточкой %s !\n', PSETS{i}.Patran_name, PSETS{i}.ID, upper(PSETS{i}.card), upper(MATERIALS{AT_MATERIALS(PSETS{i}.MID)}.card));
                        ErrCode = -1;
                        return;

                end
            
            end
            
        case 'PBARL'
            
            % Проверка на допустимость значений
            
            if (~isempty(PSETS{i}.GROUP))
                if(~strcmpi(PSETS{i}.GROUP, 'MSCBML0'))
                    fprintf (1, '\nНеизвестный тип параметра GROUP в карточке property set %s с номером %i [%s] !\n', PSETS{i}.Patran_name, PSETS{i}.ID, upper(PSETS{i}.card));
                    fprintf (1, 'Обратитесь к разработчику для решения этого вопроса.\n');
                    ErrCode = -1;
                    return;
                end
            end
            
            for j=1:size(PSETS{i}.DIM, 1)
                if (PSETS{i}.DIM(j) <= 0)
                    fprintf (1, '\nНедопустимое значение параметра DIM%i в property set %s с номером %i [%s] !\n', j, PSETS{i}.Patran_name, PSETS{i}.ID, upper(PSETS{i}.card));
                    ErrCode = -1;
                    return;
                end
            end
            
            % Проверка на существование материала
            
            if (Material_Related_Checks == 1)
            
                if (PSETS{i}.MID > Max_Material_Number)
                    fprintf (1, '\nProperty set %s с номером %i [%s] ссылается на несуществующий материал %i !\n', PSETS{i}.Patran_name, PSETS{i}.ID, upper(PSETS{i}.card), PSETS{i}.MID);
                    ErrCode = -1;
                    return;
                end
                if (AT_MATERIALS(PSETS{i}.MID) == 0)
                    fprintf (1, '\nProperty set %s с номером %i [%s] ссылается на несуществующий материал %i !\n', PSETS{i}.Patran_name, PSETS{i}.ID, upper(PSETS{i}.card), PSETS{i}.MID);
                    ErrCode = -1;
                    return;
                end
            
            end
            
            % Проверка на допустимость материала
            
            if (Material_Related_Checks == 1)
            
                switch upper(MATERIALS{AT_MATERIALS(PSETS{i}.MID)}.card)

                    case 'MAT1'

                        % Допустимый материал

                    case 'MAT4'

                        fprintf (1, '\nProperty set %s с номером %i [%s] ссылается на материал с карточкой MAT4 !\n', PSETS{i}.Patran_name, PSETS{i}.ID, upper(PSETS{i}.card));
                        fprintf (1, 'Property set %s с материалом MAT4 не поддерживается в текущей версии программы.\n', upper(PSETS{i}.card));
                        fprintf (1, 'Обратитесь к разработчику для решения этого вопроса.\n');
                        ErrCode = -1;
                        return;

                    case 'MAT5'

                        fprintf (1, '\nProperty set %s с номером %i [%s] ссылается на материал с карточкой MAT5 !\n', PSETS{i}.Patran_name, PSETS{i}.ID, upper(PSETS{i}.card));
                        fprintf (1, 'Property set %s с материалом MAT5 не поддерживается в текущей версии программы.\n', upper(PSETS{i}.card));
                        fprintf (1, 'Обратитесь к разработчику для решения этого вопроса.\n');
                        ErrCode = -1;
                        return;

                    otherwise

                        fprintf (1, '\nНедопустимая ссылка property set %s с номером %i [%s] на материал с карточкой %s !\n', PSETS{i}.Patran_name, PSETS{i}.ID, upper(PSETS{i}.card), upper(MATERIALS{AT_MATERIALS(PSETS{i}.MID)}.card));
                        ErrCode = -1;
                        return;

                end
            
            end
            
        case 'PBEAM'
            
            % Проверка на присутствие или отсутствие полей карточки
            
            if (isempty(PSETS{i}.A))
                fprintf (1, '\nПустое поле A в карточке property set %s с номером %i [%s] !\n', PSETS{i}.Patran_name, PSETS{i}.ID, upper(PSETS{i}.card));
                fprintf (1, 'Карточки %s с пустым полем A не поддерживаются в текущей версии программы.\n', upper(PSETS{i}.card));
                fprintf (1, 'Обратитесь к разработчику для решения этого вопроса.\n');
                ErrCode = -1;
                return;
            end
            
            if (isempty(PSETS{i}.I1))
                fprintf (1, '\nПустое поле I1 в карточке property set %s с номером %i [%s] !\n', PSETS{i}.Patran_name, PSETS{i}.ID, upper(PSETS{i}.card));
                fprintf (1, 'Карточки %s с пустым полем I1 не поддерживаются в текущей версии программы.\n', upper(PSETS{i}.card));
                fprintf (1, 'Обратитесь к разработчику для решения этого вопроса.\n');
                ErrCode = -1;
                return;
            end
            
            if (isempty(PSETS{i}.I2))
                fprintf (1, '\nПустое поле I2 в карточке property set %s с номером %i [%s] !\n', PSETS{i}.Patran_name, PSETS{i}.ID, upper(PSETS{i}.card));
                fprintf (1, 'Карточки %s с пустым полем I2 не поддерживаются в текущей версии программы.\n', upper(PSETS{i}.card));
                fprintf (1, 'Обратитесь к разработчику для решения этого вопроса.\n');
                ErrCode = -1;
                return;
            end
            
            if (isempty(PSETS{i}.J))
                fprintf (1, '\nПустое поле J в карточке property set %s с номером %i [%s] !\n', PSETS{i}.Patran_name, PSETS{i}.ID, upper(PSETS{i}.card));
                fprintf (1, 'Карточки %s с пустым полем J не поддерживаются в текущей версии программы.\n', upper(PSETS{i}.card));
                fprintf (1, 'Обратитесь к разработчику для решения этого вопроса.\n');
                ErrCode = -1;
                return;
            end
            
            % Проверка на допустимость значений
            
            if (PSETS{i}.A <= 0)
                fprintf (1, '\nНедопустимое значение параметра A в property set %s с номером %i [%s] !\n', PSETS{i}.Patran_name, PSETS{i}.ID, upper(PSETS{i}.card));
                ErrCode = -1;
                return;
            end
            
            if (PSETS{i}.I1 <= 0)
                fprintf (1, '\nНедопустимое значение параметра I1 в property set %s с номером %i [%s] !\n', PSETS{i}.Patran_name, PSETS{i}.ID, upper(PSETS{i}.card));
                ErrCode = -1;
                return;
            end
            
            if (PSETS{i}.I2 <= 0)
                fprintf (1, '\nНедопустимое значение параметра I2 в property set %s с номером %i [%s] !\n', PSETS{i}.Patran_name, PSETS{i}.ID, upper(PSETS{i}.card));
                ErrCode = -1;
                return;
            end
            
            if (~isempty(PSETS{i}.I12))
                if (PSETS{i}.I1 * PSETS{i}.I2 < PSETS{i}.I12 * PSETS{i}.I12)
                    fprintf (1, '\nОшибка: не выполнено условие I1*I2 >= (I12)^2 в property set %s с номером %i [%s] !\n', PSETS{i}.Patran_name, PSETS{i}.ID, upper(PSETS{i}.card));
                    fprintf (1, 'Отредактируйте property set в базе с моделью.\n');
                    ErrCode = -1;
                    return;
                end
            end
            
            if (PSETS{i}.J <= 0)
                fprintf (1, '\nНедопустимое значение параметра J в property set %s с номером %i [%s] !\n', PSETS{i}.Patran_name, PSETS{i}.ID, upper(PSETS{i}.card));
                ErrCode = -1;
                return;
            end
            
            % Проверка на существование материала
            
            if (Material_Related_Checks == 1)
            
                if (PSETS{i}.MID > Max_Material_Number)
                    fprintf (1, '\nProperty set %s с номером %i [%s] ссылается на несуществующий материал %i !\n', PSETS{i}.Patran_name, PSETS{i}.ID, upper(PSETS{i}.card), PSETS{i}.MID);
                    ErrCode = -1;
                    return;
                end
                if (AT_MATERIALS(PSETS{i}.MID) == 0)
                    fprintf (1, '\nProperty set %s с номером %i [%s] ссылается на несуществующий материал %i !\n', PSETS{i}.Patran_name, PSETS{i}.ID, upper(PSETS{i}.card), PSETS{i}.MID);
                    ErrCode = -1;
                    return;
                end
            
            end
            
            % Проверка на допустимость материала
            
            if (Material_Related_Checks == 1)
            
                switch upper(MATERIALS{AT_MATERIALS(PSETS{i}.MID)}.card)

                    case 'MAT1'

                        % Допустимый материал

                    case 'MAT4'

                        fprintf (1, '\nProperty set %s с номером %i [%s] ссылается на материал с карточкой MAT4 !\n', PSETS{i}.Patran_name, PSETS{i}.ID, upper(PSETS{i}.card));
                        fprintf (1, 'Property set %s с материалом MAT4 не поддерживается в текущей версии программы.\n', upper(PSETS{i}.card));
                        fprintf (1, 'Обратитесь к разработчику для решения этого вопроса.\n');
                        ErrCode = -1;
                        return;

                    case 'MAT5'

                        fprintf (1, '\nProperty set %s с номером %i [%s] ссылается на материал с карточкой MAT5 !\n', PSETS{i}.Patran_name, PSETS{i}.ID, upper(PSETS{i}.card));
                        fprintf (1, 'Property set %s с материалом MAT5 не поддерживается в текущей версии программы.\n', upper(PSETS{i}.card));
                        fprintf (1, 'Обратитесь к разработчику для решения этого вопроса.\n');
                        ErrCode = -1;
                        return;

                    otherwise

                        fprintf (1, '\nНедопустимая ссылка property set %s с номером %i [%s] на материал с карточкой %s !\n', PSETS{i}.Patran_name, PSETS{i}.ID, upper(PSETS{i}.card), upper(MATERIALS{AT_MATERIALS(PSETS{i}.MID)}.card));
                        ErrCode = -1;
                        return;

                end
            
            end
            
            % Проверка промежуточных состояний
            if (PSETS{i}.N_intermediate_states > 0)
                
                B_end_find_flag = 0;
                tmp_X_XB_array = zeros(PSETS{i}.N_intermediate_states,1);
                
                for k=1:PSETS{i}.N_intermediate_states
                    
                    if ((B_end_find_flag == 0) && (PSETS{i}.Intermediate_states_data{k}.X_XB == 1))
                        B_end_find_flag = 1;
                    end
                    
                    tmp_X_XB_array(k) = PSETS{i}.Intermediate_states_data{k}.X_XB;
                    
                    % Проверка значений SO
                    switch upper(PSETS{i}.Intermediate_states_data{k}.SO)
                        case 'YES'
                            % допустимое значение
                        case 'YESA'
                            % допустимое значение
                        case 'NO'
                            % допустимое значение
                        otherwise
                            fprintf (1, '\nНеизвестное значение параметра SO [%s] в карточке property set %s с номером %i [%s] !\n', PSETS{i}.Intermediate_states_data{k}.SO, PSETS{i}.Patran_name, PSETS{i}.ID, upper(PSETS{i}.card));
                            fprintf (1, 'Обратитесь к разработчику для решения этого вопроса.\n');
                            ErrCode = -1;
                            return;
                    end
                    
                    % Проверка параметров промежуточных сечений
                    
                    if (isempty(PSETS{i}.Intermediate_states_data{k}.A))
                        if (isempty(PSETS{i}.Intermediate_states_data{PSETS{i}.N_intermediate_states}.A))
                            Value_at_end_B = PSETS{i}.A;
                        else
                            Value_at_end_B = PSETS{i}.Intermediate_states_data{PSETS{i}.N_intermediate_states}.A;
                        end
                        
                        A = Value_at_end_B * PSETS{i}.Intermediate_states_data{k}.X_XB + PSETS{i}.A * (1 - PSETS{i}.Intermediate_states_data{k}.X_XB);
                        
                    else
                        A = PSETS{i}.Intermediate_states_data{k}.A;
                    end
                    
                    if (isempty(PSETS{i}.Intermediate_states_data{k}.I1))
                        if (isempty(PSETS{i}.Intermediate_states_data{PSETS{i}.N_intermediate_states}.I1))
                            Value_at_end_B = PSETS{i}.I1;
                        else
                            Value_at_end_B = PSETS{i}.Intermediate_states_data{PSETS{i}.N_intermediate_states}.I1;
                        end
                        
                        I1 = Value_at_end_B * PSETS{i}.Intermediate_states_data{k}.X_XB + PSETS{i}.I1 * (1 - PSETS{i}.Intermediate_states_data{k}.X_XB);
                        
                    else
                        I1 = PSETS{i}.Intermediate_states_data{k}.I1;
                    end
                    
                    if (isempty(PSETS{i}.Intermediate_states_data{k}.I2))
                        if (isempty(PSETS{i}.Intermediate_states_data{PSETS{i}.N_intermediate_states}.I2))
                            Value_at_end_B = PSETS{i}.I2;
                        else
                            Value_at_end_B = PSETS{i}.Intermediate_states_data{PSETS{i}.N_intermediate_states}.I2;
                        end
                        
                        I2 = Value_at_end_B * PSETS{i}.Intermediate_states_data{k}.X_XB + PSETS{i}.I2 * (1 - PSETS{i}.Intermediate_states_data{k}.X_XB);
                        
                    else
                        I2 = PSETS{i}.Intermediate_states_data{k}.I2;
                    end
                    
                    if (isempty(PSETS{i}.Intermediate_states_data{k}.I12))
                        if (isempty(PSETS{i}.Intermediate_states_data{PSETS{i}.N_intermediate_states}.I12))
                            Value_at_end_B = PSETS{i}.I12;
                        else
                            Value_at_end_B = PSETS{i}.Intermediate_states_data{PSETS{i}.N_intermediate_states}.I12;
                        end
                        
                        Value_at_end_A = PSETS{i}.I12;
                        
                        if (isempty(Value_at_end_A))
                            Value_at_end_A = 0;
                        end
                        
                        if (isempty(Value_at_end_B))
                            Value_at_end_B = 0;
                        end
                        
                        I12 = Value_at_end_B * PSETS{i}.Intermediate_states_data{k}.X_XB + Value_at_end_A * (1 - PSETS{i}.Intermediate_states_data{k}.X_XB);
                        
                    else
                        I12 = PSETS{i}.Intermediate_states_data{k}.I12;
                    end
                    
                    if (isempty(PSETS{i}.Intermediate_states_data{k}.J))
                        if (isempty(PSETS{i}.Intermediate_states_data{PSETS{i}.N_intermediate_states}.J))
                            Value_at_end_B = PSETS{i}.J;
                        else
                            Value_at_end_B = PSETS{i}.Intermediate_states_data{PSETS{i}.N_intermediate_states}.J;
                        end
                        
                        J = Value_at_end_B * PSETS{i}.Intermediate_states_data{k}.X_XB + PSETS{i}.J * (1 - PSETS{i}.Intermediate_states_data{k}.X_XB);
                        
                    else
                        J = PSETS{i}.Intermediate_states_data{k}.J;
                    end
                    
                    if (A <= 0)
                        fprintf (1, '\nНедопустимое значение параметра A в промежуточном сечении X/XB = %e в карточке property set %s с номером %i [%s] !\n', PSETS{i}.Intermediate_states_data{k}.X_XB, PSETS{i}.Patran_name, PSETS{i}.ID, upper(PSETS{i}.card));
                        ErrCode = -1;
                        return;
                    end

                    if (I1 <= 0)
                        fprintf (1, '\nНедопустимое значение параметра I1 в промежуточном сечении X/XB = %e в карточке property set %s с номером %i [%s] !\n', PSETS{i}.Intermediate_states_data{k}.X_XB, PSETS{i}.Patran_name, PSETS{i}.ID, upper(PSETS{i}.card));
                        ErrCode = -1;
                        return;
                    end

                    if (I2 <= 0)
                        fprintf (1, '\nНедопустимое значение параметра I2 в промежуточном сечении X/XB = %e в карточке property set %s с номером %i [%s] !\n', PSETS{i}.Intermediate_states_data{k}.X_XB, PSETS{i}.Patran_name, PSETS{i}.ID, upper(PSETS{i}.card));
                        ErrCode = -1;
                        return;
                    end

                    if (~isempty(I12))
                        if (I1 * I2 < I12 * I12)
                            fprintf (1, '\nОшибка: не выполнено условие I1*I2 >= (I12)^2 в промежуточном сечении X/XB = %e в карточке property set %s с номером %i [%s] !\n', PSETS{i}.Intermediate_states_data{k}.X_XB, PSETS{i}.Patran_name, PSETS{i}.ID, upper(PSETS{i}.card));
                            fprintf (1, 'Отредактируйте property set в базе с моделью.\n');
                            ErrCode = -1;
                            return;
                        end
                    end

                    if (J <= 0)
                        fprintf (1, '\nНедопустимое значение параметра J в промежуточном сечении X/XB = %e в карточке property set %s с номером %i [%s] !\n', PSETS{i}.Intermediate_states_data{k}.X_XB, PSETS{i}.Patran_name, PSETS{i}.ID, upper(PSETS{i}.card));
                        ErrCode = -1;
                        return;
                    end
                    
                end
                
                % Проверка на существование значения X_XB = 1
                if (B_end_find_flag == 0)
                    fprintf (1, '\nОшибка: не найдено промежуточного состояния, соответствующего значению параметра X/XB = 1, в карточке property set %s с номером %i [%s] !\n', PSETS{i}.Patran_name, PSETS{i}.ID, upper(PSETS{i}.card));
                    fprintf (1, 'Обратитесь к разработчику для решения этого вопроса.\n');
                    ErrCode = -1;
                    return;
                end
                
                % Проверка на уникальность значений X_XB
                tmp_X_XB_array = unique(tmp_X_XB_array);
                if (size(tmp_X_XB_array,1) ~= PSETS{i}.N_intermediate_states)
                    fprintf (1, '\nОшибка: обнаружены повторяющиеся параметры X/XB среди промежуточных состояний в карточке property set %s с номером %i [%s] !\n', PSETS{i}.Patran_name, PSETS{i}.ID, upper(PSETS{i}.card));
                    fprintf (1, 'Обратитесь к разработчику для решения этого вопроса.\n');
                    ErrCode = -1;
                    return;
                end
                
            end
            
        case 'PBEAML'
            
            % Проверка на допустимость значений
            
            if (~isempty(PSETS{i}.GROUP))
                if(~strcmpi(PSETS{i}.GROUP, 'MSCBML0'))
                    fprintf (1, '\nНеизвестный тип параметра GROUP в карточке property set %s с номером %i [%s] !\n', PSETS{i}.Patran_name, PSETS{i}.ID, upper(PSETS{i}.card));
                    fprintf (1, 'Обратитесь к разработчику для решения этого вопроса.\n');
                    ErrCode = -1;
                    return;
                end
            end
            
            for j=1:size(PSETS{i}.DIM, 1)
                if (PSETS{i}.DIM(j) <= 0)
                    fprintf (1, '\nНедопустимое значение параметра DIM%i в property set %s с номером %i [%s] !\n', j, PSETS{i}.Patran_name, PSETS{i}.ID, upper(PSETS{i}.card));
                    ErrCode = -1;
                    return;
                end
            end
            
            % Проверка на существование материала
            
            if (Material_Related_Checks == 1)
            
                if (PSETS{i}.MID > Max_Material_Number)
                    fprintf (1, '\nProperty set %s с номером %i [%s] ссылается на несуществующий материал %i !\n', PSETS{i}.Patran_name, PSETS{i}.ID, upper(PSETS{i}.card), PSETS{i}.MID);
                    ErrCode = -1;
                    return;
                end
                if (AT_MATERIALS(PSETS{i}.MID) == 0)
                    fprintf (1, '\nProperty set %s с номером %i [%s] ссылается на несуществующий материал %i !\n', PSETS{i}.Patran_name, PSETS{i}.ID, upper(PSETS{i}.card), PSETS{i}.MID);
                    ErrCode = -1;
                    return;
                end
            
            end
            
            % Проверка на допустимость материала
            
            if (Material_Related_Checks == 1)
            
                switch upper(MATERIALS{AT_MATERIALS(PSETS{i}.MID)}.card)

                    case 'MAT1'

                        % Допустимый материал

                    case 'MAT4'

                        fprintf (1, '\nProperty set %s с номером %i [%s] ссылается на материал с карточкой MAT4 !\n', PSETS{i}.Patran_name, PSETS{i}.ID, upper(PSETS{i}.card));
                        fprintf (1, 'Property set %s с материалом MAT4 не поддерживается в текущей версии программы.\n', upper(PSETS{i}.card));
                        fprintf (1, 'Обратитесь к разработчику для решения этого вопроса.\n');
                        ErrCode = -1;
                        return;

                    case 'MAT5'

                        fprintf (1, '\nProperty set %s с номером %i [%s] ссылается на материал с карточкой MAT5 !\n', PSETS{i}.Patran_name, PSETS{i}.ID, upper(PSETS{i}.card));
                        fprintf (1, 'Property set %s с материалом MAT5 не поддерживается в текущей версии программы.\n', upper(PSETS{i}.card));
                        fprintf (1, 'Обратитесь к разработчику для решения этого вопроса.\n');
                        ErrCode = -1;
                        return;

                    otherwise

                        fprintf (1, '\nНедопустимая ссылка property set %s с номером %i [%s] на материал с карточкой %s !\n', PSETS{i}.Patran_name, PSETS{i}.ID, upper(PSETS{i}.card), upper(MATERIALS{AT_MATERIALS(PSETS{i}.MID)}.card));
                        ErrCode = -1;
                        return;

                end
            
            end
            
            % Проверка промежуточных состояний
            if (PSETS{i}.N_intermediate_states > 0)
                
                B_end_find_flag = 0;
                tmp_X_XB_array = zeros(PSETS{i}.N_intermediate_states,1);
                
                for k=1:PSETS{i}.N_intermediate_states
                    
                    if (isempty(PSETS{i}.Intermediate_states_data{k}.X_XB) || ((~isempty(PSETS{i}.Intermediate_states_data{k}.X_XB)) && (PSETS{i}.Intermediate_states_data{k}.X_XB == 1)))
                        B_end_find_flag = 1;
                    end
                    
                    if (isempty(PSETS{i}.Intermediate_states_data{k}.X_XB))
                        tmp_X_XB_array(k) = 1;
                    else
                        tmp_X_XB_array(k) = PSETS{i}.Intermediate_states_data{k}.X_XB;
                    end
                    
                    % Проверка значений SO
                    if (~isempty(PSETS{i}.Intermediate_states_data{k}.SO))
                    
                        switch upper(PSETS{i}.Intermediate_states_data{k}.SO)
                            case 'YES'
                                % допустимое значение
                            case 'NO'
                                % допустимое значение
                            otherwise
                                fprintf (1, '\nНеизвестное значение параметра SO [%s] в карточке property set %s с номером %i [%s] !\n', PSETS{i}.Intermediate_states_data{k}.SO, PSETS{i}.Patran_name, PSETS{i}.ID, upper(PSETS{i}.card));
                                fprintf (1, 'Обратитесь к разработчику для решения этого вопроса.\n');
                                ErrCode = -1;
                                return;
                        end
                    
                    end
                    
                    % Проверка параметров промежуточных сечений
                    for j=1:size(PSETS{i}.Intermediate_states_data{k}.DIM, 1)
                        if ((PSETS{i}.Intermediate_states_data{k}.DIM(j) == 0) || (PSETS{i}.Intermediate_states_data{k}.DIM(j) < -1)) % Значение -1 в данном массиве обозначает пустое поле в bdf файле (см. описание карточки PBEAML)
                            if (isempty(PSETS{i}.Intermediate_states_data{k}.X_XB))
                                X_XB = 1;
                            else
                                X_XB = PSETS{i}.Intermediate_states_data{k}.X_XB;
                            end
                            fprintf (1, '\nНедопустимое значение параметра DIM%i в промежуточном сечении X/XB = %e в карточке property set %s с номером %i [%s] !\n', j, X_XB, PSETS{i}.Patran_name, PSETS{i}.ID, upper(PSETS{i}.card));
                            fprintf (1, 'Обратитесь к разработчику для решения этого вопроса.\n');
                            ErrCode = -1;
                            return;
                        end
                    end
                    
                end
                
                % Проверка на существование значения X_XB = 1
                if (B_end_find_flag == 0)
                    fprintf (1, '\nОшибка: не найдено промежуточного состояния, соответствующего значению параметра X/XB = 1, в карточке property set %s с номером %i [%s] !\n', PSETS{i}.Patran_name, PSETS{i}.ID, upper(PSETS{i}.card));
                    fprintf (1, 'Обратитесь к разработчику для решения этого вопроса.\n');
                    ErrCode = -1;
                    return;
                end
                
                % Проверка на уникальность значений X_XB
                tmp_X_XB_array = unique(tmp_X_XB_array);
                if (size(tmp_X_XB_array,1) ~= PSETS{i}.N_intermediate_states)
                    fprintf (1, '\nОшибка: обнаружены повторяющиеся параметры X/XB среди промежуточных состояний в карточке property set %s с номером %i [%s] !\n', PSETS{i}.Patran_name, PSETS{i}.ID, upper(PSETS{i}.card));
                    fprintf (1, 'Обратитесь к разработчику для решения этого вопроса.\n');
                    ErrCode = -1;
                    return;
                end
                
            end
            
        case 'PBCOMP'
            
            % Проверка на присутствие или отсутствие полей карточки
            
            if (isempty(PSETS{i}.A))
                fprintf (1, '\nПустое поле A в карточке property set %s с номером %i [%s] !\n', PSETS{i}.Patran_name, PSETS{i}.ID, upper(PSETS{i}.card));
                fprintf (1, 'Карточки %s с пустым полем A не поддерживаются в текущей версии программы.\n', upper(PSETS{i}.card));
                fprintf (1, 'Обратитесь к разработчику для решения этого вопроса.\n');
                ErrCode = -1;
                return;
            end
            
            % Проверка на допустимость значений
            
            if (PSETS{i}.A <= 0)
                fprintf (1, '\nНедопустимое значение параметра A в property set %s с номером %i [%s] !\n', PSETS{i}.Patran_name, PSETS{i}.ID, upper(PSETS{i}.card));
                ErrCode = -1;
                return;
            end
            
            if (~isempty(PSETS{i}.I1))
                if (PSETS{i}.I1 <= 0)
                    fprintf (1, '\nНедопустимое значение параметра I1 в property set %s с номером %i [%s] !\n', PSETS{i}.Patran_name, PSETS{i}.ID, upper(PSETS{i}.card));
                    ErrCode = -1;
                    return;
                end
            end
            
            if (~isempty(PSETS{i}.I2))
                if (PSETS{i}.I2 <= 0)
                    fprintf (1, '\nНедопустимое значение параметра I2 в property set %s с номером %i [%s] !\n', PSETS{i}.Patran_name, PSETS{i}.ID, upper(PSETS{i}.card));
                    ErrCode = -1;
                    return;
                end
            end
            
            if ((~isempty(PSETS{i}.I12)) && (~isempty(PSETS{i}.I1)) && (~isempty(PSETS{i}.I2)))
                if (PSETS{i}.I1 * PSETS{i}.I2 < PSETS{i}.I12 * PSETS{i}.I12)
                    fprintf (1, '\nОшибка: не выполнено условие I1*I2 >= (I12)^2 в property set %s с номером %i [%s] !\n', PSETS{i}.Patran_name, PSETS{i}.ID, upper(PSETS{i}.card));
                    fprintf (1, 'Отредактируйте property set в базе с моделью.\n');
                    ErrCode = -1;
                    return;
                end
            end
            
            if (~isempty(PSETS{i}.J))
                if (PSETS{i}.J <= 0)
                    fprintf (1, '\nНедопустимое значение параметра J в property set %s с номером %i [%s] !\n', PSETS{i}.Patran_name, PSETS{i}.ID, upper(PSETS{i}.card));
                    ErrCode = -1;
                    return;
                end
            end
            
            % Проверка на существование материала
            
            if (Material_Related_Checks == 1)
            
                if (PSETS{i}.MID > Max_Material_Number)
                    fprintf (1, '\nProperty set %s с номером %i [%s] ссылается на несуществующий материал %i !\n', PSETS{i}.Patran_name, PSETS{i}.ID, upper(PSETS{i}.card), PSETS{i}.MID);
                    ErrCode = -1;
                    return;
                end
                if (AT_MATERIALS(PSETS{i}.MID) == 0)
                    fprintf (1, '\nProperty set %s с номером %i [%s] ссылается на несуществующий материал %i !\n', PSETS{i}.Patran_name, PSETS{i}.ID, upper(PSETS{i}.card), PSETS{i}.MID);
                    ErrCode = -1;
                    return;
                end
            
            end
            
            % Проверка на допустимость материала
            
            if (Material_Related_Checks == 1)
            
                switch upper(MATERIALS{AT_MATERIALS(PSETS{i}.MID)}.card)

                    case 'MAT1'

                        % Допустимый материал

                    case 'MAT4'

                        fprintf (1, '\nProperty set %s с номером %i [%s] ссылается на материал с карточкой MAT4 !\n', PSETS{i}.Patran_name, PSETS{i}.ID, upper(PSETS{i}.card));
                        fprintf (1, 'Property set %s с материалом MAT4 не поддерживается в текущей версии программы.\n', upper(PSETS{i}.card));
                        fprintf (1, 'Обратитесь к разработчику для решения этого вопроса.\n');
                        ErrCode = -1;
                        return;

                    case 'MAT5'

                        fprintf (1, '\nProperty set %s с номером %i [%s] ссылается на материал с карточкой MAT5 !\n', PSETS{i}.Patran_name, PSETS{i}.ID, upper(PSETS{i}.card));
                        fprintf (1, 'Property set %s с материалом MAT5 не поддерживается в текущей версии программы.\n', upper(PSETS{i}.card));
                        fprintf (1, 'Обратитесь к разработчику для решения этого вопроса.\n');
                        ErrCode = -1;
                        return;

                    otherwise

                        fprintf (1, '\nНедопустимая ссылка property set %s с номером %i [%s] на материал с карточкой %s !\n', PSETS{i}.Patran_name, PSETS{i}.ID, upper(PSETS{i}.card), upper(MATERIALS{AT_MATERIALS(PSETS{i}.MID)}.card));
                        ErrCode = -1;
                        return;

                end
            
            end
            
            
            % Проверка сосредоточенных элементов сечения
            
            if (PSETS{i}.N_lumped_areas > 0)
                
                for k=1:PSETS{i}.N_lumped_areas
                    
                    if (~isempty(PSETS{i}.Lumped_area_data{k}.MID))
                
                        % Проверка на существование материала
                        
                        if (Material_Related_Checks == 1)

                            if (PSETS{i}.Lumped_area_data{k}.MID > Max_Material_Number)
                                fprintf (1, '\nProperty set %s с номером %i [%s] ссылается на несуществующий материал %i !\n', PSETS{i}.Patran_name, PSETS{i}.ID, upper(PSETS{i}.card), PSETS{i}.Lumped_area_data{k}.MID);
                                ErrCode = -1;
                                return;
                            end
                            if (AT_MATERIALS(PSETS{i}.Lumped_area_data{k}.MID) == 0)
                                fprintf (1, '\nProperty set %s с номером %i [%s] ссылается на несуществующий материал %i !\n', PSETS{i}.Patran_name, PSETS{i}.ID, upper(PSETS{i}.card), PSETS{i}.Lumped_area_data{k}.MID);
                                ErrCode = -1;
                                return;
                            end
                        
                        end

                        % Проверка на допустимость материала
                        
                        if (Material_Related_Checks == 1)

                            switch upper(MATERIALS{AT_MATERIALS(PSETS{i}.Lumped_area_data{k}.MID)}.card)

                                case 'MAT1'

                                    % Допустимый материал

                                case 'MAT4'

                                    fprintf (1, '\nProperty set %s с номером %i [%s] ссылается на материал с карточкой MAT4 !\n', PSETS{i}.Patran_name, PSETS{i}.ID, upper(PSETS{i}.card));
                                    fprintf (1, 'Property set %s с материалом MAT4 не поддерживается в текущей версии программы.\n', upper(PSETS{i}.card));
                                    fprintf (1, 'Обратитесь к разработчику для решения этого вопроса.\n');
                                    ErrCode = -1;
                                    return;

                                case 'MAT5'

                                    fprintf (1, '\nProperty set %s с номером %i [%s] ссылается на материал с карточкой MAT5 !\n', PSETS{i}.Patran_name, PSETS{i}.ID, upper(PSETS{i}.card));
                                    fprintf (1, 'Property set %s с материалом MAT5 не поддерживается в текущей версии программы.\n', upper(PSETS{i}.card));
                                    fprintf (1, 'Обратитесь к разработчику для решения этого вопроса.\n');
                                    ErrCode = -1;
                                    return;

                                otherwise

                                    fprintf (1, '\nНедопустимая ссылка property set %s с номером %i [%s] на материал с карточкой %s !\n', PSETS{i}.Patran_name, PSETS{i}.ID, upper(PSETS{i}.card), upper(MATERIALS{AT_MATERIALS(PSETS{i}.Lumped_area_data{k}.MID)}.card));
                                    ErrCode = -1;
                                    return;

                            end
                        
                        end
                    
                    end
                
                end
                
            end
            
        otherwise
            
            fprintf (1, '\nНеизвестная карточка property set с номером %i [%s] !\n', PSETS{i}.ID, PSETS{i}.card);
            ErrCode = -1;
            return;
        
    end
    
end

fprintf (1, 'OK!\n');
